package com.ace.scenep.day0115;

import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.Duration;

/**
 * 简单计数器实现
 * 用于统计网站的访问量
 */
public class MyCounter {
    // 访问计数器
    private final AtomicInteger count = new AtomicInteger(0);
    
    // 定时任务执行器
    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
    
    public MyCounter() {
        // 在构造函数中启动定时重置任务
        startAutoReset();
    }
    
    /**
     * 增加计数
     * 注意：不需要synchronized，因为AtomicInteger本身是线程安全的
     */
    public void increment() {
        count.incrementAndGet();
    }
    
    /**
     * 获取当前计数
     */
    public int getCount() {
        return count.get();
    }
    
    /**
     * 手动重置计数
     */
    public void reset() {
        count.set(0);
    }
    
    /**
     * 设置自动重置任务
     */
    private void startAutoReset() {
        // 获取当前时间
        LocalDateTime now = LocalDateTime.now();
        // 计算下一个凌晨0点的时间（当前日期+1天的凌晨）
        LocalDateTime nextReset = now.with(LocalTime.MIDNIGHT).plusDays(1);
        System.out.println("Next reset time: " + nextReset);
        // 计算从当前时间到下一个凌晨0点的毫秒数
        long initialDelay = Duration.between(now, nextReset).toMillis();
        System.out.println("Initial delay: " + initialDelay);
        
        // 使用ScheduledExecutorService安排定时任务
        // 参数说明：
        // 1. this::reset - 要执行的任务（重置计数器）
        // 2. initialDelay - 首次执行的延迟时间（毫秒）
        // 3. TimeUnit.DAYS.toMillis(1) - 后续任务的执行间隔（1天的毫秒数）
        // 4. TimeUnit.MILLISECONDS - 时间单位（毫秒）
        scheduler.scheduleAtFixedRate(
            this::reset,
            initialDelay,
            TimeUnit.DAYS.toMillis(1),
            TimeUnit.MILLISECONDS
        );
    }
    
    /**
     * 关闭计数器
     */
    public void shutdown() {
        scheduler.shutdown();
    }
}